//
//  RegisterViewController.m
//  Palabris
//
//  Created by 822588 on 28.11.12.
//  Copyright 2012 __MyCompanyName__. All rights reserved.
//

#import "RegisterViewController.h"


@implementation RegisterViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)dealloc
{
    
    [mTextFieldUsername release];
    [mImageViewUserPicture release];
    [mActivityIndicatorView release];
    
    [super dealloc];
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    
    [self initCustom];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}



/* Custom initialization
 */
-(void)initCustom{
    
    sharedSingleton = [SingletonClass sharedInstance]; 

    // Hier wird ein Default-Bild für den user bereit gestellt, falls er kein eigenes machen möchte.
    [mImageViewUserPicture setImage:[UIImage imageWithData:
                                     [NSData dataWithContentsOfFile:
                                      [[NSBundle mainBundle] pathForResource:@"DefaultUserImage" ofType:@"png"]]]];
}

/* Keyboard no more cover the Textfield
 */
-(IBAction)textFieldDidBeginEditing:(UITextField *)textField
{
    [sharedSingleton slideFrame:YES :self.view :180];
}

-(IBAction)textFieldDidEndEditing:(UITextField *)textField
{
    [sharedSingleton slideFrame:NO :self.view :180];
}

/*  Hide Keyboard
 * 
 *  Lässt den Keyboard verschwinden, wenn der Hintergrund der View angeklickt wird
 */
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    if(touch.phase == UITouchPhaseBegan) {
        [mTextFieldUsername resignFirstResponder];
    }
}


////////////////////////////////////
//  Event-Buttons                 //
////////////////////////////////////

/*  Push to PhotoPickerViewController
 */
-(IBAction)goPhotoPicker:(id)sender{
    
    // Als erstes erstellt man ein Object vom ViewController (Page) zu der man hin will
    PhotoPickerViewController *view = [[PhotoPickerViewController alloc] initWithNibName:@"PhotoPickerViewController" bundle:nil];
    
    // Hier bestimmt ich welche Animation der Übergang bekommt
    view.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    
    // Hier ruft man von der NavigationController (der oberste Vater-Controller) die Push Methode, die dich zu anderen View bringt.
    [self.navigationController pushViewController:view animated:YES];
    

    [view release];
    
}


/*  Push to MainscreenViewController
 *
 *  Hier wird der User zuerst registriert und wenn das klappt, kommt er in die MainscreenVC
 */
-(IBAction)goMainscreen:(id)sender{
    
    // Pruefen ob dieser Username bereits exstiert
    
    // Hier sagen wir, dass der User damit fertig ist etwas einzugeben. Damit das System auch den Keyboard weg macht !
    [mTextFieldUsername resignFirstResponder];
    
    if([mTextFieldUsername text] != nil && 
       [mTextFieldUsername text] != NULL && 
       [[mTextFieldUsername text] length] != 0 ){
        
        // Der ActivityIndicatorView (Loader), wird hier gestartet und beim Fin
        [mActivityIndicatorView startAnimating];
        
        
        // Hier wird die Request erstellt
        mRequest = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:URL_SERVICE]];
        mRequest.delegate = self;
        [mRequest addPostValue:@"hiscore" forKey:@"action"];
        
        // Tage 0 , Request für: Überprüfen ob der username bereits vorhanden ist.
        mRequest.tag = 0;
        
        // Hier wird die Request gestartet
        // Asynchron, da wir den User waerend dessen eine Loading-Meldung geben wollen (Ladebalken oder Ladekreis)
        [mRequest startAsynchronous];
        
    }else{
        // popup
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No Input!" 
                                                        message:@"Please enter your desired Username." 
                                                       delegate:nil 
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        [alert release];        
    }    
}


/*  PoptoRoot to RootViewController
 */
-(IBAction)goRoot:(id)sender{
    
    
    [self.navigationController popToRootViewControllerAnimated:YES];
}



////////////////////////////////////
//  PhotoPicker Functions         //
////////////////////////////////////


-(IBAction)getPhotoFromCamera:(id)sender{
    
    if( [UIImagePickerController isCameraDeviceAvailable: UIImagePickerControllerCameraDeviceFront ])
    {    
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.delegate = self;
       
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;  
    
        [self presentModalViewController:picker animated:YES];
        
    }else{
        
        // popup
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Camera not available" 
                                                        message:@"Because of using the simulator, there is no available camera!" 
                                                       delegate:nil 
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        [alert release];     
    }
}
-(IBAction)getPhotoFromAlbum:(id)sender{
    
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    
    picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    
    [self presentModalViewController:picker animated:YES];
}

/*imagePickerController ->dynamical changing of image sizes*/
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    
    [picker dismissModalViewControllerAnimated:YES];
    mImageViewUserPicture.frame = CGRectMake(85, 50, 150, 200);
    
    /*NSLog(@"x: %f, y: %f", mImageViewUserPicture.frame.size.width, mImageViewUserPicture.frame.size.height);*/
    
    [mImageViewUserPicture setImage:(UIImage*)[info objectForKey:@"UIImagePickerControllerOriginalImage"]];
    
}


////////////////////////////////////
//  ASIHTTPRequest Functions      //
////////////////////////////////////


- (void) requestFailed:(ASIHTTPRequest *)request {
    
    [mActivityIndicatorView stopAnimating];
    
    // Tage 0 , Request für: Überprüfen ob der username bereits vorhanden ist.
    // Tage 1 , Request für: User registrierung.
    if(request.tag == 0){
        
        // popup
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Request failed" 
                                                        message:@"The User Indication Request is failed" 
                                                       delegate:nil 
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        [alert release];   
        
    }else{
        
        // popup
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Request failed" 
                                                        message:@"The Request to register the User is failed" 
                                                       delegate:nil 
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        [alert release];         
    }
    
    mRequest = nil;
}

- (void) requestFinished:(ASIHTTPRequest *)request {
    

    // Tage 0 , Request für: Überprüfen ob der username bereits vorhanden ist.
    // Tage 1 , Request für: User registrierung.
    if(request.tag == 0){


        
        // Dann erstellen wir ein Dokument indem die Element vom XMLFile rein kommen.
        mXMLDocOfEntitys = [[CXMLDocument alloc] initWithXMLString:[mRequest responseString] options:0 error:nil];
        // Hier sagen wir, welches Element wir wollen
        // Explizit hier, fragen wir nach allen "entry"-Elementen
        NSArray *nodes = [mXMLDocOfEntitys nodesForXPath:@"//entry" error:nil];
        
        Boolean isUsernameRegistered = false;

        
        // Ueberpruefen ob das Username bereits registriert ist
        // Suchen wir mal alles durch
        for(CXMLElement *node in nodes){
            
            
            // Vergleichen wir die Werte
            if( [[mTextFieldUsername text] isEqualToString:[node stringValue]]){
                
                isUsernameRegistered = true;
            }
        }
    
        
        if(isUsernameRegistered == false){
            
            
            //
            // Jetzt wissen wir, dass der User nicht registriert ist und können
            // nun eine zweite Request machen, um den User zu registrieren.
            //
            
            // Hier wird die Request erstellt
            mRequest = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:URL_SERVICE]];
            mRequest.delegate = self;
            
            [mRequest addPostValue:@"register" forKey:@"action"];
            [mRequest addPostValue:[mTextFieldUsername text] forKey:@"username"];      
            [mRequest addData:UIImagePNGRepresentation([mImageViewUserPicture image]) forKey:@"image"];
            
            // Tag 1 , Request für: User registrierung.
            mRequest.tag = 1;
            
            // Hier wird die Request gestartet
            // Asynchron, da wir den User waerend dessen eine Loading-Meldung geben wollen (Ladebalken oder Ladekreis)
            [mRequest startAsynchronous];
            
        }else{
            
            // popup
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Register failed" 
                                                            message:@"Your Username is already there." 
                                                           delegate:nil 
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];
            [alert release];        
        }
        
    }else{
        
        
        [mActivityIndicatorView stopAnimating];
        
        // Nun ist der Usernamen und User-Hishscore auch für andere VC erreichbar
        sharedSingleton.mUsername = [mTextFieldUsername text];
        sharedSingleton.mUserHighscore = 0;
        sharedSingleton.mUserImage = [mImageViewUserPicture image];
        
        mRequest = nil;        
        
        //
        // Wenn alle notwendigen Requests erfolgreich waren, dann darf der User ins Mainscreen rein
        //
        
        // Als erstes erstellt man ein Object vom ViewController (Page) zu der man hin will
        MainscreenViewController *view = [[MainscreenViewController alloc] initWithNibName:@"MainscreenViewController" bundle:nil];
        
        // Hier bestimmt ich welche Animation der Übergang bekommt
        view.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
        
        // Normal brauchen wir den NC nicht expicit in einer Property, doch wir wollen hier mehrere Pop und Push Aktionen durch führen.
        UINavigationController *navController = self.navigationController;
        // Deshalb müssen wir auch den Controller retainen, damit der Controller nach dem pop weiter existiert um den restlichen Code ebenfalls durch zu führen.
        [[self retain] autorelease];
        
        // Wir wollen, dass die MainscreenVC im Stack an zweiter Stelle kommt, damit andere VC's wissen an welche Stelle Sie poppen sollen um zur MainscreenVC zu gelangen
        // Achte dran, dass die Animation ausgeschaltet ist, damit es für den User nicht aussieht, als ob das System ein Fenster übersprungen hat.
        [navController popToRootViewControllerAnimated:NO];    
        
        // Hier ruft man von der NavigationController (der oberste Vater-Controller) die Push Methode, die dich zu anderen View bringt.
        [navController pushViewController:view animated:YES];
        
        
        [view release];
    }
    
    
    
    
}

@end
